| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228 |
1
1
18
18
10
10
10
10
10
10
10
1
1
10
10
10
1
1
10
8
8
10
3
7
4
3
3
10
10
10
10
3
3
3
1
1
2
3
10
4
4
4
1
1
3
4
10
3
3
3
1
1
2
3
10
10
10
10
18
13
13
13
3
7
3
3
3
10
9
9
9
1
1
1
10
10
10
10
10
10
7
7
3
10
18
| "use strict";
(function (angular) {
"use strict";
angular.module("oc.lazyLoad").config(function ($provide) {
$provide.decorator("$ocLazyLoad", function ($delegate, $q) {
/**
* The function that loads new files
* @param config
* @param params
* @returns {*}
*/
$delegate.filesLoader = function filesLoader(config) {
var params = arguments[1] === undefined ? {} : arguments[1];
var cssFiles = [],
templatesFiles = [],
jsFiles = [],
promises = [],
cachePromise = null,
filesCache = $delegate.getFilesCache();
$delegate.toggleWatch(true); // start watching angular.module calls
angular.extend(params, config);
var pushFile = function pushFile(path) {
var file_type = null,
m;
if (angular.isObject(path)) {
file_type = path.type;
path = path.path;
}
cachePromise = filesCache.get(path);
Eif (angular.isUndefined(cachePromise) || params.cache === false) {
// always check for requirejs syntax just in case
if ((m = /^(css|less|html|htm|js)?(?=!)/.exec(path)) !== null) {
// Detect file type using preceding type declaration (ala requireJS)
file_type = m[1];
path = path.substr(m[1].length + 1, path.length); // Strip the type from the path
}
if (!file_type) {
Eif ((m = /[.](css|less|html|htm|js)?(\?.*)?$/.exec(path)) !== null) {
// Detect file type via file extension
file_type = m[1];
} else if (!$delegate.jsLoader.hasOwnProperty("ocLazyLoadLoader") && $delegate.jsLoader.hasOwnProperty("load")) {
// requirejs
file_type = "js";
} else {
$delegate.$log.error("File type could not be determined. " + path);
return;
}
}
if ((file_type === "css" || file_type === "less") && cssFiles.indexOf(path) === -1) {
cssFiles.push(path);
} else if ((file_type === "html" || file_type === "htm") && templatesFiles.indexOf(path) === -1) {
templatesFiles.push(path);
} else Eif (file_type === "js" || jsFiles.indexOf(path) === -1) {
jsFiles.push(path);
} else {
$delegate.$log.error("File type is not valid. " + path);
}
} else if (cachePromise) {
promises.push(cachePromise);
}
};
Iif (params.serie) {
pushFile(params.files.shift());
} else {
angular.forEach(params.files, function (path) {
pushFile(path);
});
}
if (cssFiles.length > 0) {
var cssDeferred = $q.defer();
$delegate.cssLoader(cssFiles, function (err) {
if (angular.isDefined(err) && $delegate.cssLoader.hasOwnProperty("ocLazyLoadLoader")) {
$delegate.$log.error(err);
cssDeferred.reject(err);
} else {
cssDeferred.resolve();
}
}, params);
promises.push(cssDeferred.promise);
}
if (templatesFiles.length > 0) {
var templatesDeferred = $q.defer();
$delegate.templatesLoader(templatesFiles, function (err) {
if (angular.isDefined(err) && $delegate.templatesLoader.hasOwnProperty("ocLazyLoadLoader")) {
$delegate.$log.error(err);
templatesDeferred.reject(err);
} else {
templatesDeferred.resolve();
}
}, params);
promises.push(templatesDeferred.promise);
}
if (jsFiles.length > 0) {
var jsDeferred = $q.defer();
$delegate.jsLoader(jsFiles, function (err) {
if (angular.isDefined(err) && $delegate.jsLoader.hasOwnProperty("ocLazyLoadLoader")) {
$delegate.$log.error(err);
jsDeferred.reject(err);
} else {
jsDeferred.resolve();
}
}, params);
promises.push(jsDeferred.promise);
}
Iif (params.serie && params.files.length > 0) {
return $q.all(promises).then(function success() {
return $delegate.filesLoader(config, params);
});
} else {
return $q.all(promises)["finally"](function (res) {
$delegate.toggleWatch(false); // stop watching angular.module calls
return res;
});
}
};
/**
* Load a module or a list of modules into Angular
* @param module Mixed the name of a predefined module config object, or a module config object, or an array of either
* @param params Object optional parameters
* @returns promise
*/
$delegate.load = function (module) {
var params = arguments[1] === undefined ? {} : arguments[1];
var self = this,
config = null,
deferredList = [],
deferred = $q.defer(),
errText;
// If module is an array, break it down
if (angular.isArray(module)) {
// Resubmit each entry as a single module
angular.forEach(module, function (m) {
deferredList.push(self.load(m, params));
});
// Resolve the promise once everything has loaded
$q.all(deferredList).then(function success() {
deferred.resolve(module);
}, function error(err) {
deferred.reject(err);
});
return deferred.promise;
}
// Get or Set a configuration depending on what was passed in
if (angular.isString(module)) {
config = self.getModuleConfig(module);
Eif (!config) {
config = {
files: [module]
};
}
} else Eif (angular.isObject(module)) {
// case {type: 'js', path: lazyLoadUrl + 'testModule.fakejs'}
Eif (angular.isDefined(module.path) && angular.isDefined(module.type)) {
config = {
files: [module]
};
} else {
config = self.setModuleConfig(module);
}
}
Iif (config === null) {
var moduleName = self.getModuleName(module);
errText = "Module \"" + (moduleName || "unknown") + "\" is not configured, cannot load.";
$delegate.$log.error(errText);
deferred.reject(new Error(errText));
return deferred.promise;
} else {
// deprecated
Iif (angular.isDefined(config.template)) {
if (angular.isUndefined(config.files)) {
config.files = [];
}
if (angular.isString(config.template)) {
config.files.push(config.template);
} else if (angular.isArray(config.template)) {
config.files.concat(config.template);
}
}
}
var localParams = {};
angular.extend(localParams, params, config);
// if someone used an external loader and called the load function with just the module name
Iif (angular.isUndefined(config.files) && angular.isDefined(config.name) && $delegate.moduleExists(config.name)) {
return $delegate.inject(config.name, localParams);
}
$delegate.filesLoader(config, localParams).then(function success() {
$delegate.inject(null, localParams).then(function () {
deferred.resolve();
}, function (err) {
deferred.reject(err);
});
}, function error(err) {
deferred.reject(err);
});
return deferred.promise;
};
// return the patched service
return $delegate;
});
});
})(angular);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3dhbXAvd3d3L29jTGF6eUxvYWQvc3JjL2xvYWRlcnMvb2NMYXp5TG9hZC5sb2FkZXJzLmNvcmUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxDQUFDLFVBQVMsT0FBTyxFQUFFO0FBQ2YsZ0JBQVksQ0FBQzs7QUFFYixXQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFTLFFBQVEsRUFBRTtBQUNwRCxnQkFBUSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsVUFBUyxTQUFTLEVBQUUsRUFBRSxFQUFFOzs7Ozs7O0FBT3RELHFCQUFTLENBQUMsV0FBVyxHQUFHLFNBQVMsV0FBVyxDQUFDLE1BQU0sRUFBZTtvQkFBYixNQUFNLGdDQUFHLEVBQUU7O0FBQzVELG9CQUFJLFFBQVEsR0FBRyxFQUFFO29CQUNiLGNBQWMsR0FBRyxFQUFFO29CQUNuQixPQUFPLEdBQUcsRUFBRTtvQkFDWixRQUFRLEdBQUcsRUFBRTtvQkFDYixZQUFZLEdBQUcsSUFBSTtvQkFDbkIsVUFBVSxHQUFHLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQzs7QUFFM0MseUJBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7O0FBRTVCLHVCQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQzs7QUFFL0Isb0JBQUksUUFBUSxHQUFHLGtCQUFTLElBQUksRUFBRTtBQUMxQix3QkFBSSxTQUFTLEdBQUcsSUFBSTt3QkFBRSxDQUFDLENBQUM7QUFDeEIsd0JBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUN2QixpQ0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDdEIsNEJBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO3FCQUNwQjtBQUNELGdDQUFZLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQyx3QkFBRyxPQUFPLENBQUMsV0FB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LFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztpQkFDckQ7O0FBRUQseUJBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLE9BQU8sR0FBRztBQUMvRCw2QkFBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVc7QUFDaEQsZ0NBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztxQkFDdEIsRUFBRSxVQUFTLEdBQUcsRUFBRTtBQUNiLGdDQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUN4QixDQUFDLENBQUM7aUJBQ04sRUFBRSxTQUFTLEtBQUssQ0FBQyxHQUFHLEVBQUU7QUFDbkIsNEJBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3hCLENBQUMsQ0FBQzs7QUFFSCx1QkFBTyxRQUFRLENBQUMsT0FBTyxDQUFDO2FBQzNCLENBQUM7OztBQUdGLG1CQUFPLFNBQVMsQ0FBQztTQUNwQixDQUFDLENBQUM7S0FDTixDQUFDLENBQUM7Q0FFTixDQUFBLENBQUUsT0FBTyxDQUFDLENBQUMiLCJmaWxlIjoiQzovd2FtcC93d3cvb2NMYXp5TG9hZC9zcmMvbG9hZGVycy9vY0xhenlMb2FkLmxvYWRlcnMuY29yZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbihhbmd1bGFyKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgYW5ndWxhci5tb2R1bGUoJ29jLmxhenlMb2FkJykuY29uZmlnKGZ1bmN0aW9uKCRwcm92aWRlKSB7XG4gICAgICAgICRwcm92aWRlLmRlY29yYXRvcignJG9jTGF6eUxvYWQnLCBmdW5jdGlvbigkZGVsZWdhdGUsICRxKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBmdW5jdGlvbiB0aGF0IGxvYWRzIG5ldyBmaWxlc1xuICAgICAgICAgICAgICogQHBhcmFtIGNvbmZpZ1xuICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAgICAgICAgICogQHJldHVybnMgeyp9XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICRkZWxlZ2F0ZS5maWxlc0xvYWRlciA9IGZ1bmN0aW9uIGZpbGVzTG9hZGVyKGNvbmZpZywgcGFyYW1zID0ge30pIHtcbiAgICAgICAgICAgICAgICB2YXIgY3NzRmlsZXMgPSBbXSxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVzRmlsZXMgPSBbXSxcbiAgICAgICAgICAgICAgICAgICAganNGaWxlcyA9IFtdLFxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlcyA9IFtdLFxuICAgICAgICAgICAgICAgICAgICBjYWNoZVByb21pc2UgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgICBmaWxlc0NhY2hlID0gJGRlbGVnYXRlLmdldEZpbGVzQ2FjaGUoKTtcblxuICAgICAgICAgICAgICAgICRkZWxlZ2F0ZS50b2dnbGVXYXRjaCh0cnVlKTsgLy8gc3RhcnQgd2F0Y2hpbmcgYW5ndWxhci5tb2R1bGUgY2FsbHNcblxuICAgICAgICAgICAgICAgIGFuZ3VsYXIuZXh0ZW5kKHBhcmFtcywgY29uZmlnKTtcblxuICAgICAgICAgICAgICAgIHZhciBwdXNoRmlsZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVfdHlwZSA9IG51bGwsIG07XG4gICAgICAgICAgICAgICAgICAgIGlmKGFuZ3VsYXIuaXNPYmplY3QocGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfdHlwZSA9IHBhdGgudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnBhdGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FjaGVQcm9taXNlID0gZmlsZXNDYWNoZS5nZXQocGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGlmKGFuZ3VsYXIuaXNVbmRlZmluZWQoY2FjaGVQcm9taXNlKSB8fCBwYXJhbXMuY2FjaGUgPT09IGZhbHNlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBjaGVjayBmb3IgcmVxdWlyZWpzIHN5bnRheCBqdXN0IGluIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKChtID0gL14oY3NzfGxlc3N8aHRtbHxodG18anMpPyg/PSEpLy5leGVjKHBhdGgpKSAhPT0gbnVsbCkgeyAvLyBEZXRlY3QgZmlsZSB0eXBlIHVzaW5nIHByZWNlZGluZyB0eXBlIGRlY2xhcmF0aW9uIChhbGEgcmVxdWlyZUpTKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfdHlwZSA9IG1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyKG1bMV0ubGVuZ3RoICsgMSwgcGF0aC5sZW5ndGgpOyAgLy8gU3RyaXAgdGhlIHR5cGUgZnJvbSB0aGUgcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZighZmlsZV90eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKG0gPSAvWy5dKGNzc3xsZXNzfGh0bWx8aHRtfGpzKT8oXFw/LiopPyQvLmV4ZWMocGF0aCkpICE9PSBudWxsKSB7ICAvLyBEZXRlY3QgZmlsZSB0eXBlIHZpYSBmaWxlIGV4dGVuc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3R5cGUgPSBtWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZighJGRlbGVnYXRlLmpzTG9hZGVyLmhhc093blByb3BlcnR5KCdvY0xhenlMb2FkTG9hZGVyJykgJiYgJGRlbGVnYXRlLmpzTG9hZGVyLmhhc093blByb3BlcnR5KCdsb2FkJykpIHsgLy8gcmVxdWlyZWpzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfdHlwZSA9ICdqcyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRlbGVnYXRlLiRsb2cuZXJyb3IoJ0ZpbGUgdHlwZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4gJyArIHBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZigoZmlsZV90eXBlID09PSAnY3NzJyB8fCBmaWxlX3R5cGUgPT09ICdsZXNzJykgJiYgY3NzRmlsZXMuaW5kZXhPZihwYXRoKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3NGaWxlcy5wdXNoKHBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKChmaWxlX3R5cGUgPT09ICdodG1sJyB8fCBmaWxlX3R5cGUgPT09ICdodG0nKSAmJiB0ZW1wbGF0ZXNGaWxlcy5pbmRleE9mKHBhdGgpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlc0ZpbGVzLnB1c2gocGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoKGZpbGVfdHlwZSA9PT0gJ2pzJykgfHwganNGaWxlcy5pbmRleE9mKHBhdGgpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzRmlsZXMucHVzaChwYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRlbGVnYXRlLiRsb2cuZXJyb3IoJ0ZpbGUgdHlwZSBpcyBub3QgdmFsaWQuICcgKyBwYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoY2FjaGVQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGNhY2hlUHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYocGFyYW1zLnNlcmllKSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hGaWxlKHBhcmFtcy5maWxlcy5zaGlmdCgpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gocGFyYW1zLmZpbGVzLCBwYXRoID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hGaWxlKHBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZihjc3NGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjc3NEZWZlcnJlZCA9ICRxLmRlZmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICRkZWxlZ2F0ZS5jc3NMb2FkZXIoY3NzRmlsZXMsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc0RlZmluZWQoZXJyKSAmJiAkZGVsZWdhdGUuY3NzTG9hZGVyLmhhc093blByb3BlcnR5KCdvY0xhenlMb2FkTG9hZGVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVsZWdhdGUuJGxvZy5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzc0RlZmVycmVkLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3NEZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goY3NzRGVmZXJyZWQucHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYodGVtcGxhdGVzRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGVzRGVmZXJyZWQgPSAkcS5kZWZlcigpO1xuICAgICAgICAgICAgICAgICAgICAkZGVsZWdhdGUudGVtcGxhdGVzTG9hZGVyKHRlbXBsYXRlc0ZpbGVzLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFuZ3VsYXIuaXNEZWZpbmVkKGVycikgJiYgJGRlbGVnYXRlLnRlbXBsYXRlc0xvYWRlci5oYXNPd25Qcm9wZXJ0eSgnb2NMYXp5TG9hZExvYWRlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRlbGVnYXRlLiRsb2cuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZXNEZWZlcnJlZC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVzRGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRlbXBsYXRlc0RlZmVycmVkLnByb21pc2UpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmKGpzRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIganNEZWZlcnJlZCA9ICRxLmRlZmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICRkZWxlZ2F0ZS5qc0xvYWRlcihqc0ZpbGVzLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFuZ3VsYXIuaXNEZWZpbmVkKGVycikgJiYgJGRlbGVnYXRlLmpzTG9hZGVyLmhhc093blByb3BlcnR5KCdvY0xhenlMb2FkTG9hZGVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVsZWdhdGUuJGxvZy5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzRGVmZXJyZWQucmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzRGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGpzRGVmZXJyZWQucHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYocGFyYW1zLnNlcmllICYmIHBhcmFtcy5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkcS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gc3VjY2VzcygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkZGVsZWdhdGUuZmlsZXNMb2FkZXIoY29uZmlnLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHEuYWxsKHByb21pc2VzKS5maW5hbGx5KGZ1bmN0aW9uKHJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGRlbGVnYXRlLnRvZ2dsZVdhdGNoKGZhbHNlKTsgLy8gc3RvcCB3YXRjaGluZyBhbmd1bGFyLm1vZHVsZSBjYWxsc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBMb2FkIGEgbW9kdWxlIG9yIGEgbGlzdCBvZiBtb2R1bGVzIGludG8gQW5ndWxhclxuICAgICAgICAgICAgICogQHBhcmFtIG1vZHVsZSBNaXhlZCB0aGUgbmFtZSBvZiBhIHByZWRlZmluZWQgbW9kdWxlIGNvbmZpZyBvYmplY3QsIG9yIGEgbW9kdWxlIGNvbmZpZyBvYmplY3QsIG9yIGFuIGFycmF5IG9mIGVpdGhlclxuICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtcyBPYmplY3Qgb3B0aW9uYWwgcGFyYW1ldGVyc1xuICAgICAgICAgICAgICogQHJldHVybnMgcHJvbWlzZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAkZGVsZWdhdGUubG9hZCA9IGZ1bmN0aW9uKG1vZHVsZSwgcGFyYW1zID0ge30pIHtcbiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkTGlzdCA9IFtdLFxuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9ICRxLmRlZmVyKCksXG4gICAgICAgICAgICAgICAgICAgIGVyclRleHQ7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBtb2R1bGUgaXMgYW4gYXJyYXksIGJyZWFrIGl0IGRvd25cbiAgICAgICAgICAgICAgICBpZihhbmd1bGFyLmlzQXJyYXkobW9kdWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZXN1Ym1pdCBlYWNoIGVudHJ5IGFzIGEgc2luZ2xlIG1vZHVsZVxuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gobW9kdWxlLCBmdW5jdGlvbihtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZExpc3QucHVzaChzZWxmLmxvYWQobSwgcGFyYW1zKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgdGhlIHByb21pc2Ugb25jZSBldmVyeXRoaW5nIGhhcyBsb2FkZWRcbiAgICAgICAgICAgICAgICAgICAgJHEuYWxsKGRlZmVycmVkTGlzdCkudGhlbihmdW5jdGlvbiBzdWNjZXNzKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShtb2R1bGUpO1xuICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiBlcnJvcihlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBHZXQgb3IgU2V0IGEgY29uZmlndXJhdGlvbiBkZXBlbmRpbmcgb24gd2hhdCB3YXMgcGFzc2VkIGluXG4gICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc1N0cmluZyhtb2R1bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IHNlbGYuZ2V0TW9kdWxlQ29uZmlnKG1vZHVsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFjb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlczogW21vZHVsZV1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYoYW5ndWxhci5pc09iamVjdChtb2R1bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhc2Uge3R5cGU6ICdqcycsIHBhdGg6IGxhenlMb2FkVXJsICsgJ3Rlc3RNb2R1bGUuZmFrZWpzJ31cbiAgICAgICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc0RlZmluZWQobW9kdWxlLnBhdGgpICYmIGFuZ3VsYXIuaXNEZWZpbmVkKG1vZHVsZS50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzOiBbbW9kdWxlXVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IHNlbGYuc2V0TW9kdWxlQ29uZmlnKG1vZHVsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZihjb25maWcgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZHVsZU5hbWUgPSBzZWxmLmdldE1vZHVsZU5hbWUobW9kdWxlKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyVGV4dCA9ICdNb2R1bGUgXCInICsgKG1vZHVsZU5hbWUgfHwgJ3Vua25vd24nKSArICdcIiBpcyBub3QgY29uZmlndXJlZCwgY2Fubm90IGxvYWQuJztcbiAgICAgICAgICAgICAgICAgICAgJGRlbGVnYXRlLiRsb2cuZXJyb3IoZXJyVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChuZXcgRXJyb3IoZXJyVGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBkZXByZWNhdGVkXG4gICAgICAgICAgICAgICAgICAgIGlmKGFuZ3VsYXIuaXNEZWZpbmVkKGNvbmZpZy50ZW1wbGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFuZ3VsYXIuaXNVbmRlZmluZWQoY29uZmlnLmZpbGVzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5maWxlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc1N0cmluZyhjb25maWcudGVtcGxhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZpbGVzLnB1c2goY29uZmlnLnRlbXBsYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihhbmd1bGFyLmlzQXJyYXkoY29uZmlnLnRlbXBsYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5maWxlcy5jb25jYXQoY29uZmlnLnRlbXBsYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBsb2NhbFBhcmFtcyA9IHt9O1xuICAgICAgICAgICAgICAgIGFuZ3VsYXIuZXh0ZW5kKGxvY2FsUGFyYW1zLCBwYXJhbXMsIGNvbmZpZyk7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBzb21lb25lIHVzZWQgYW4gZXh0ZXJuYWwgbG9hZGVyIGFuZCBjYWxsZWQgdGhlIGxvYWQgZnVuY3Rpb24gd2l0aCBqdXN0IHRoZSBtb2R1bGUgbmFtZVxuICAgICAgICAgICAgICAgIGlmKGFuZ3VsYXIuaXNVbmRlZmluZWQoY29uZmlnLmZpbGVzKSAmJiBhbmd1bGFyLmlzRGVmaW5lZChjb25maWcubmFtZSkgJiYgJGRlbGVnYXRlLm1vZHVsZUV4aXN0cyhjb25maWcubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRkZWxlZ2F0ZS5pbmplY3QoY29uZmlnLm5hbWUsIGxvY2FsUGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAkZGVsZWdhdGUuZmlsZXNMb2FkZXIoY29uZmlnLCBsb2NhbFBhcmFtcykudGhlbihmdW5jdGlvbiBzdWNjZXNzKCkge1xuICAgICAgICAgICAgICAgICAgICAkZGVsZWdhdGUuaW5qZWN0KG51bGwsIGxvY2FsUGFyYW1zKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiBlcnJvcihlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIHJldHVybiB0aGUgcGF0Y2hlZCBzZXJ2aWNlXG4gICAgICAgICAgICByZXR1cm4gJGRlbGVnYXRlO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxufSkoYW5ndWxhcik7XG4iXX0= |